SSH package for U++
--------------------

SSH package is a libssh2 wrapper for Ultimate++.
It aims to be a complete secure shell client solution. (SFtp, Scp, Exec, Terminal, X11, known hosts)
Currently it is at a technical preview stage, which means it is a work-in-progress, and subject to change.

Requirements:
--------------------

- A C++ compiler with at least C++11 support.
- libssh2 ssh library (https://www.libssh2.org/)
- JobQueue package (for U++).

Features and Highlights:
--------------------

- Tight integration with U++.
- Support for both synchronous and asynchronous operations  with both high level and low level methods.
- Allows using U++ style memory [de/re]allocators with libssh2.
- Ssh subsystems support RTTI, and share a common interface for polymorphism. 
  Namely, it is possible to store different subsystems in the same U++ container. 
  (e.g. SFtp, Exec, Scp, Shell can be all stored in the same Array.)
- Supports password, public key, and keyboard interaction methods for client authorizaion.
- Supports known hosts verification, and known_hosts file manipulations.

Todo:
--------------------

- Add ssh agents support.
- Add more high level methods.
- Add ssh X11 support.
- Documentation.

History:
--------------------
2017-08-11:  Initial api reference docs for Ssh, Ssh::SubSystem, SFtp, Scp, Exec, Knownhosts, are added.
2017-07-31:  It is now possible to query, get, and set the possible transportation methods and exchange 
             algorithms. Added Ssh::Method(), Ssh::Methods(), Ssh::GetMethod(), Ssh::GetMethods() methods. 
             Ssh::Host class is from now on KnownHosts class.
2017-07-21:  Authentication methods (password, public key, keyboard interaction) are properly implemented.
             From now on it is possible to choose between authentication methods both on initialization,
             and on-the-fly (i.e. while logging in, using WhenAuth callback). 
             Ssh::Host class is added to the package. This class provides basic known hosts support.
             It is now possible to verify and trust servers.
             SshAlloc named as SshMalloc, and made into a general-purpose memory allocator (needed for keyboard callback).
             SshSubsystem class is now Ssh::Subsystem.
2017-07-04:  Credits should go to Koldo and Tom (Tom1). I am grateful for their feedback. Thanks!
             Include paths fixes. 
2017-07-03:  libssh2 config: Newer diffie-hellman-group-exchange-sha1 syntax enabled.
2017-07-02:  Initial MSC support added.
             Due to a name clash on MSC environment, addrinfo changed to ip_addrinfo.
2017-06-30:  The source code of libssh2 is added to the SSH package. 
             Exec::operator()() made inline.          
2017-06-29:  SshSubsystem::To(): reinterpret_csst() replaced with dynamic_cast().
2017-06-28:  EAGAIN is now properly handled across the subsystems.
             WhenWrite and WhenRead callbacks are removed in favour of parametrized gates.
2017-06-27:  SFtp::StartStop: fixed.
2017-06-27:  CleanUp() methods are added to the classes Ssh, SFtp, and Channel.
             This method utilizes JobQueue's WhenCleanup event.
2017-06-26:  U++ memory [de/re]allocators added and made default.
             initial support for ssh shell, and terminal added.
             Subsystems now perform a clean up on failure to prevent possible heap leaks.          
2017-06-22:  Initial release.
